/*
 Trabajo Practico 2 Ejercicio 3
 Entrega número: 1

 - Integrantes:
	- Martinez, Guillermo	DNI: 34510461
	- Meli, Marcos		DNI: 31832759
	- Reyes, Leandro	DNI: 34213699
	- Rodriguez, Lucas	DNI: 34265017
	- Cortez, Martin	DNI: 30440023
*/

#include "hijo.h"
#include "../tools/tools.h"

void manejar_senal(int no_senal, siginfo_t *info, void *noseusa) {
		//Valido que la señal recibida para finalizar sea del padre, si es asi finaliza si no la ignora.
        if(info->si_signo == SIGINT && getppid() == info->si_pid){
		printf("Hijo %d > Finalizando...\n", getpid());
                exit(0);
	}
}

void hijo () {
        struct sigaction sa;
        int i, senal, segundos, stopDetected = 0;
		char description[STR_SIZE + 1];
        sa.sa_flags=SA_SIGINFO;
        sa.sa_sigaction=&manejar_senal; 
		//Ignoro todas las señales y las maneja el handler manejar_senal.
        for(i = SIGHUP ; i <= SIGRTMAX ; i++)
                sigaction(i, &sa, NULL);

        while(1){
		//Selección de que señal se le enviara al padre, si la anterior fue SIGSTOP se envia SIGCONT.
		if(stopDetected == 0)
			do{
				senal = (rand() % SIGSYS) + SIGHUP;
			}while(senal == SIGKILL);
		else
			senal = SIGCONT;

		//La señal se enviara entre 1 y 4 segundos.
		segundos = (rand() % 4) + 1;

		printf("Hijo %d > Esperando %d segundos...\n",getpid(), segundos);
		sleep(segundos);

		//Envio la señal, consigo su descripcion y lanzo un mensaje por pantalla.
		kill(getppid(), senal);
		GetString( description, STR_SIZE, senal );
		printf("Hijo %d > Se envió la señal %s al proceso %d.\n",getpid(), description, getppid());

		if(senal == SIGSTOP)
			stopDetected = 1;
        }
}